iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
1

routing

在介紹完model驗證之後要開始介紹網頁程式設計的另一個觀念路由routing,更明確的說明應該是網址路由才對,所以接下來開始跟大家介紹網址路由。

本文同步放置於此

routing

路由常會讓人聯想到的是網路層的路由,簡單來說就如維基百科上對路由的說明,將網路訊息傳到對應的地方,不過這裡定義的路由明確來說是網址路由,接下來跟大家先說明一下網址路由,再跟大家說明如何在iris上透過網址路由來處理使用者的請求。

什麼是routing

什麼是網址路由呢,簡單講就是在網址上傳遞有意義的資訊,例如下列網址

example.com/api/users/2345/profile

如此可以知道他是要被導到users的profile的這個handler並且告訴伺服器使用者編號是2345。
所以接下來要告訴大家在iris要如何處理這一類的請求,並能導到正確的handler,並且能取得正確的使用者編號2345。

怎麼在iris上處理routing問題

這裡我們拿iris-go routing的範例來跟大家說明如何使用iris來處理網址路由的請求,首先大家先看看下列例子

app := iris.New()

// http://localhost:8080/api/users/2345/profile
app.Get("api/users/{id:uint64}/profile", userProfileHandler)

如此就能夠將前面說明的網址綁定到userProfileHandler這個handler上,除了這樣子綁定到對應的handler之外iris還可以將handler分群,接下來在說明handler分群。

group routing

上述例子說明了如何處理網址路由,如果今天又在多一個網址如下那該如何處理呢

example.com/api/users/messages/1

由於目前的網址與上述的網址有一定的相似度,所定可以將兩個網址路由分在一個群組,所以在iris的處理如下所示

app := iris.New()

users := app.Party("api/users", myAuthMiddlewareHandler)

// http://localhost:8080/api/users/42/profile
users.Get("/{id:uint64}/profile", userProfileHandler)
// http://localhost:8080/api/users/messages/1
users.Get("/messages/{id:uint64}", userMessageHandler)

除了上述的綁定該網址到handler之外,還有另外一種PartyFunc的寫法,如下列例子

app := iris.New()

app.PartyFunc("api/users", func(users iris.Party) {
    users.Use(myAuthMiddlewareHandler)

    // http://localhost:8080/api/users/42/profile
    users.Get("/{id:uint64}/profile", userProfileHandler)
    // http://localhost:8080/api/users/messages/1
    users.Get("/messages/{id:uint64}", userMessageHandler)
})

這兩種分群的方式結果都一樣,就看大家習慣怎麼寫,所以對於網址路由綁定到對應的handler到此告一段落,不過我們還有一個沒有說明到,接下來跟大家說明如何取得網址上對應的參數。

path parameters

上面例子都是說明該如何綁定到對應的handler,但是沒有說明該如何從網址上取出參數,所以接下來先看一下下面例子

func userProfileHandler(ctx iris.Context) {
    ctx.Writef("id (uint64): %s", ctx.Params().GetUint64("id"))
}

上述例子是實作一個handler專門處理下列網址

example.com/api/users/2345/profile

其中就是透過ctx.Params().GetUint64("id")來取得參數2345。

網址路由的注意事項

在iris的網址路由的處理能夠正確的綁定到對應的handler,但是這部分要注意的是對於網址綁定的邏輯認知錯誤的狀況,請大家看看以下兩種綁定方式

app.Get("/profile/{username:string}", userHandler)
app.Get("/profile/me", userHandler2)

依據上面的綁定方式,其中/profile/me會被綁定到userHandler2,其他的/profile/*會被綁定到userHandler,若是不是這樣的認知就會造成網頁邏輯的誤判。最後請看一下網址路由參數的類別對於網路路由綁定有很大的幫助。

結論

今天跟大家分享如何在iris上處理透過網址而發出來的請求,希望大家對於網址路由已經iris如何處理網址路由有更進一步的瞭解。


上一篇
iris的model驗證
下一篇
iris的middleware
系列文
Iris這個在go語言上地表最快的網頁框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言